package com.ruoyi.common.enums;

import lombok.Getter;

/**
 * Modbus 功能码枚举类
 * 包含Modbus协议中定义的常用功能码及其说明
 */
@Getter
public enum ModbusFunctionCode {

    // 读线圈状态 (0x01)
    READ_COILS(1, "读线圈状态", "读取从站设备中多个线圈的状态"),

    // 读离散输入 (0x02)
    READ_DISCRETE_INPUTS(2, "读离散输入", "读取从站设备中多个离散输入的状态"),

    // 读保持寄存器 (0x03)
    READ_HOLDING_REGISTERS(3, "读保持寄存器", "读取从站设备中多个保持寄存器的值"),

    // 读输入寄存器 (0x04)
    READ_INPUT_REGISTERS(4, "读输入寄存器", "读取从站设备中多个输入寄存器的值"),

    // 写单个线圈 (0x05)
    WRITE_SINGLE_COIL(5, "写单个线圈", "向从站设备的单个线圈写入值"),

    // 写单个寄存器 (0x06)
    WRITE_SINGLE_REGISTER(6, "写单个寄存器", "向从站设备的单个寄存器写入值"),

    // 读异常状态 (0x07)
    READ_EXCEPTION_STATUS(7, "读异常状态", "读取从站设备的异常状态"),

    // 诊断 (0x08)
    DIAGNOSTIC(8, "诊断", "执行从站设备的诊断功能"),

    // 写多个线圈 (0x0F)
    WRITE_MULTIPLE_COILS(15, "写多个线圈", "向从站设备的多个线圈写入值"),

    // 写多个寄存器 (0x10)
    WRITE_MULTIPLE_REGISTERS(16, "写多个寄存器", "向从站设备的多个寄存器写入值"),

    // 报告从站ID (0x11)
    REPORT_SLAVE_ID(17, "报告从站ID", "读取从站设备的ID信息"),

    // 读文件记录 (0x14)
    READ_FILE_RECORD(20, "读文件记录", "读取从站设备的文件记录"),

    // 写文件记录 (0x15)
    WRITE_FILE_RECORD(21, "写文件记录", "向从站设备写入文件记录"),

    // 读通用参数 (0x1A)
    READ_GENERAL_PARAMETERS(26, "读通用参数", "读取从站设备的通用参数"),

    // 写通用参数 (0x1B)
    WRITE_GENERAL_PARAMETERS(27, "写通用参数", "向从站设备写入通用参数"),

    // 读设备识别 (0x2B)
    READ_DEVICE_IDENTIFICATION(43, "读设备识别", "读取从站设备的识别信息"),

    // 写设备识别 (0x2C)
    WRITE_DEVICE_IDENTIFICATION(44, "写设备识别", "向从站设备写入识别信息");

    // Getter方法
    private final int code;
    private final String name;
    private final String description;

    ModbusFunctionCode(int code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    /**
     * 根据功能码值获取对应的枚举实例
     * @param code 功能码值
     * @return 对应的ModbusFunctionCode枚举实例，若不存在则返回null
     */
    public static ModbusFunctionCode fromCode(int code) {
        for (ModbusFunctionCode functionCode : values()) {
            if (functionCode.code == code) {
                return functionCode;
            }
        }
        return null;
    }

    /**
     * 判断是否为写功能码
     * @return true如果是写功能码，false否则
     */
    public boolean isWriteFunction() {
        return code == WRITE_SINGLE_COIL.getCode() ||
                code == WRITE_SINGLE_REGISTER.getCode() ||
                code == WRITE_MULTIPLE_COILS.getCode() ||
                code == WRITE_MULTIPLE_REGISTERS.getCode() ||
                code == WRITE_FILE_RECORD.getCode() ||
                code == WRITE_GENERAL_PARAMETERS.getCode() ||
                code == WRITE_DEVICE_IDENTIFICATION.getCode();
    }
}
